#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <assert.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
	if (argc <= 2)
	{
		printf("usage: %s ip_address port_number\n", basename(argv[0]));
		return 1;
	}

	const char* ip = argv[1];
	int port = atoi(argv[2]);

	struct sockaddr_in server_address;
	bzero(&server_address, sizeof(server_address));
	server_address.sin_family = AF_INET;
	inet_pton(AF_INET, ip, &server_address.sin_addr);
	server_address.sin_port = htons(port);
	int sock = socket(PF_INET, SOCK_STREAM, 0);
	assert(sock > 0);

	if (connect(sock, (struct sockaddr*)&server_address,sizeof(server_address)) < 0)
	{
		printf("connection failed\n");
	}
	else
	{
		const char* oob_data = "abc";
		const char* normal_data = "123";
		send(sock, normal_data, strlen(normal_data), 0);
		send(sock, oob_data ,strlen(oob_data), MSG_OOB);
		send(sock, normal_data, strlen(normal_data), 0);
		
		char buffer[BUF_SIZE];

		memset(sock, '\0', BUF_SIZE);
		ret = recv(connfd, buffer, BUF_SIZE-1, 0);
		printf("got %d bytes of normal data '%s'\n", ret, buffer);
	}
	return 0;
}
